home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power Programmierung
/
Power-Programmierung (Tewi)(1994).iso
/
magazine
/
msysjour
/
vol04
/
01b
/
macsl
/
mpmquery.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-10-04
|
13KB
|
487 lines
/*-----------------------------------------------------------------*/
/* MpmQuery.c */
/* Information gathering functions */
/*-----------------------------------------------------------------*/
#include "MacPM.h"
/*-----------------------------------------------------------------*/
/* Stuff pahwndKids with the child window handles of hwndParent */
/* from idMin to idMax. */
/*-----------------------------------------------------------------*/
SHORT APIENTRY WinMultWindowFromIDs( hwndParent, pahwndKids,
idMin, idMax )
HWND hwndParent;
PHWND pahwndKids;
USHORT idMin, idMax;
{
HWND hwnd;
USHORT id;
SHORT sFound;
memset( pahwndKids, 0, (idMax - idMin + 1) * sizeof(HWND) );
if( ! MpmValidateWindow(hwndParent) )
return 0;
if( ISDESKTOPWINDOW(hwndParent) )
return 0; /* could handle this case... */
sFound = 0;
for( hwnd = MYWNDOF(hwndParent).hwndTopChild;
hwnd;
hwnd = MYWNDOF(hwnd).hwndNextSibling )
{
id = MYWNDOF(hwnd).id;
if( id >= idMin && id <= idMax )
{
pahwndKids[ id - idMin ] = hwnd;
sFound++;
}
}
return sFound;
}
/*-----------------------------------------------------------------*/
/* Return the active window handle. We ignore fLock. */
/*-----------------------------------------------------------------*/
HWND APIENTRY WinQueryActiveWindow( hwndDesktop, fLock )
HWND hwndDesktop;
BOOL fLock;
{
ASSERT( ! hwndDesktop ||
hwndDesktop == HWND_DESKTOP ||
hwndDesktop == _hwndDesktop,
"WinQueryActiveWindow: bad hwndDesktop" );
return _hwndActive;
}
/*-----------------------------------------------------------------*/
/* Fill pszName (max len sNameMax) with hwnd's window class name. */
/*-----------------------------------------------------------------*/
SHORT APIENTRY WinQueryClassName( hwnd, sNameMax, pszName )
HWND hwnd;
SHORT sNameMax;
PSZ pszName;
{
SHORT sNameLen;
pszName[0] = '\0';
if( ! MpmValidateWindow(hwnd) )
return 0;
if( ! sNameMax )
return 0;
sNameLen = strlen( MYCLASSOF(hwnd).szName );
if( sNameLen > sNameMax-1 )
sNameLen = sNameMax - 1;
memcpy( pszName, MYCLASSOF(hwnd).szName, sNameLen );
pszName[sNameLen] = '\0';
return sNameLen;
}
/*-----------------------------------------------------------------*/
/* Return the desktop window handle. */
/*-----------------------------------------------------------------*/
HWND APIENTRY WinQueryDesktopWindow( hab, hdc )
HAB hab;
HDC hdc;
{
ASSERT( ! hdc,
"WinQueryDesktopWindow: hdc must be NULL" );
/* ignore hab */
return _hwndDesktop;
}
/*-----------------------------------------------------------------*/
/* Return the object window handle. */
/*-----------------------------------------------------------------*/
HWND APIENTRY WinQueryObjectWindow( hwndDesktop )
HWND hwndDesktop;
{
ASSERT( ! hwndDesktop ||
hwndDesktop == HWND_DESKTOP ||
hwndDesktop == _hwndDesktop,
"WinQueryObjectWindow: bad hwndDesktop" );
return _hwndObject;
}
/*-----------------------------------------------------------------*/
/* Return one of the SV_ system values. */
/*-----------------------------------------------------------------*/
LONG APIENTRY WinQuerySysValue( hwndDesktop, iSysValue )
HWND hwndDesktop;
SHORT iSysValue;
{
if( iSysValue < 0 || iSysValue >= SV_CSYSVALUES )
return 0;
return _alSysVal[iSysValue];
}
/*-----------------------------------------------------------------*/
/* Return one of hwnd's relatives as determined by cmd. */
/* This is done differently depending on hwnd's WK_ window kind, */
/* since we use the Mac's window information for WK_MAIN windows, */
/* and our own fields for child windows. */
/* We ignore fLock. */
/*-----------------------------------------------------------------*/
HWND APIENTRY WinQueryWindow( hwnd, cmd, fLock )
HWND hwnd;
SHORT cmd;
BOOL fLock;
{
UCHAR ucKind;
WindowPeek pwin;
if( ! MpmValidateWindow(hwnd) )
return FALSE;
ucKind = MYWNDOF(hwnd).ucKind;
top:
switch( cmd )
{
case QW_NEXT:
switch( ucKind )
{
case WK_DESKTOP:
case WK_OBJECT:
return NULL;
case WK_MAIN:
pwin = PWINOFHWND(hwnd)->nextWindow;
return pwin ? HWNDOFPWIN(pwin) : NULL;
case WK_CHILD:
return MYWNDOF(hwnd).hwndNextSibling;
}
break;
case QW_PREV:
switch( ucKind )
{
case WK_DESKTOP:
case WK_OBJECT:
return NULL;
case WK_MAIN:
return NULL; /* later take care of this... */
case WK_CHILD:
return MYWNDOF(hwnd).hwndPrevSibling;
}
break;
case QW_TOP:
switch( ucKind )
{
case WK_DESKTOP:
return HWNDOFPWIN( WindowList );
case WK_OBJECT:
case WK_MAIN:
case WK_CHILD:
return MYWNDOF(hwnd).hwndTopChild;
}
break;
case QW_BOTTOM:
switch( ucKind )
{
case WK_DESKTOP:
return NULL; /* later... */
case WK_OBJECT:
case WK_MAIN:
case WK_CHILD:
return MYWNDOF(hwnd).hwndBottomChild;
}
break;
case QW_OWNER:
return MYWNDOF(hwnd).hwndOwner;
case QW_PARENT:
switch( ucKind )
{
case WK_DESKTOP:
case WK_OBJECT:
case WK_MAIN:
return NULL;
case WK_CHILD:
return MYWNDOF(hwnd).hwndParent;
}
break;
case QW_NEXTTOP:
switch( ucKind )
{
case WK_DESKTOP:
case WK_OBJECT:
return NULL;
case WK_MAIN:
cmd = QW_NEXT;
goto top;
case WK_CHILD:
while( ISCHILDWINDOW(hwnd) )
hwnd = MYWNDOF(hwnd).hwndParent;
return hwnd;
}
break;
case QW_PREVTOP:
switch( ucKind )
{
case WK_DESKTOP:
case WK_OBJECT:
return NULL;
case WK_MAIN:
cmd = QW_PREV;
goto top;
case WK_CHILD:
cmd = QW_NEXTTOP;
goto top;
}
break;
}
return NULL;
}
/*-----------------------------------------------------------------*/
/* Return the lock count for a window. Always 0 in MacPM! */
/*-----------------------------------------------------------------*/
SHORT APIENTRY WinQueryWindowLockCount( hwnd )
HWND hwnd;
{
MpmValidateWindow( hwnd );
return 0;
}
/*-----------------------------------------------------------------*/
/* Fill *pswp with the position and size of hwnd. */
/*-----------------------------------------------------------------*/
BOOL APIENTRY WinQueryWindowPos( hwnd, pswp )
HWND hwnd;
PSWP pswp;
{
PMYWND pwnd;
if( ! MpmValidateWindow(hwnd) )
return FALSE;
pwnd = PMYWNDOF(hwnd);
pswp->fs = SWP_MOVE | SWP_SIZE;
if( pwnd->ucKind == WK_MAIN )
{
if( pwnd->pwin == (WindowPeek)FrontWindow() )
pswp->fs |= SWP_ACTIVATE;
else
pswp->fs |= SWP_DEACTIVATE;
}
pswp->x = pwnd->x;
pswp->y = pwnd->y;
pswp->cx = pwnd->cx;
pswp->cy = pwnd->cy;
pswp->hwnd = hwnd;
pswp->hwndInsertBehind = NULL;
return TRUE;
}
/*-----------------------------------------------------------------*/
/* Fill *ppid and *ptid with the process and task ID's for hwnd. */
/* In MacPM, these are fake values. */
/*-----------------------------------------------------------------*/
BOOL APIENTRY WinQueryWindowProcess( hwnd, ppid, ptid )
HWND hwnd;
PPID ppid;
PTID ptid;
{
if( ! MpmValidateWindow(hwnd) )
return FALSE;
*ppid = MY_PID;
*ptid = MY_PID;
return TRUE;
}
/*-----------------------------------------------------------------*/
/* Fill *prcl with the window rectangle for hwnd. */
/*-----------------------------------------------------------------*/
BOOL APIENTRY WinQueryWindowRect( hwnd, prcl )
HWND hwnd;
PRECTL prcl;
{
PMYWND pwnd;
if( ! MpmValidateWindow(hwnd) )
return FALSE;
pwnd = PMYWNDOF(hwnd);
prcl->xLeft = 0;
prcl->yBottom = 0;
prcl->xRight = pwnd->cx;
prcl->yTop = pwnd->cy;
return TRUE;
}
/*-----------------------------------------------------------------*/
/* Fill *pszText with hwnd's window text, by sending hwnd a */
/* WM_QUERYWINDOWPARAMS message. */
/*-----------------------------------------------------------------*/
SHORT APIENTRY WinQueryWindowText( hwnd, sMax, pszText )
HWND hwnd;
SHORT sMax;
PSZ pszText;
{
WNDPARAMS wprm;
pszText[0] = '\0';
memzero( &wprm );
wprm.fsStatus = WPM_TEXT | WPM_CCHTEXT;
wprm.pszText = pszText;
wprm.cchText = sMax;
if( WinSendMsg( hwnd, WM_QUERYWINDOWPARAMS, MPFROMP(&wprm), 0 ) )
return wprm.cchText;
else
return 0;
}
/*-----------------------------------------------------------------*/
/* Return hwnd's window text length, by sending hwnd a */
/* WM_QUERYWINDOWPARAMS message. */
/*-----------------------------------------------------------------*/
SHORT APIENTRY WinQueryWindowTextLength( hwnd )
HWND hwnd;
{
WNDPARAMS wprm;
memzero( &wprm );
wprm.fsStatus = WPM_CCHTEXT;
if( WinSendMsg( hwnd, WM_QUERYWINDOWPARAMS, MPFROMP(&wprm), 0 ) )
return wprm.cchText;
else
return 0;
}
/*-----------------------------------------------------------------*/
/* Return one of hwnd's long values, as determined by index. */
/*-----------------------------------------------------------------*/
ULONG APIENTRY WinQueryWindowULong( hwnd, index )
HWND hwnd;
SHORT index;
{
if( ! MpmValidateWindow(hwnd) )
return FALSE;
if( index >= QWL_USER )
return *(PULONG)&MYWNDOF(hwnd).bExtra[index];
switch( index )
{
case QWL_STYLE:
return MYWNDOF(hwnd).flStyle;
case QWP_PFNWP:
return (ULONG)MYWNDOF(hwnd).pfnwp;
case QWL_HMQ:
return (ULONG)(HMQ)1;
}
return 0L;
}
/*-----------------------------------------------------------------*/
/* Return one of hwnd's short values, as determined by index. */
/*-----------------------------------------------------------------*/
USHORT APIENTRY WinQueryWindowUShort( hwnd, index )
HWND hwnd;
SHORT index;
{
if( ! MpmValidateWindow(hwnd) )
return FALSE;
if( index >= QWL_USER )
return *(PUSHORT)&MYWNDOF(hwnd).bExtra[index];
switch( index )
{
case QWS_ID:
return MYWNDOF(hwnd).id;
}
return 0;
}
/*-----------------------------------------------------------------*/
/* Return the child of hwndParent with the specified window ID. */
/*-----------------------------------------------------------------*/
HWND APIENTRY WinWindowFromID( hwndParent, id )
HWND hwndParent;
USHORT id;
{
HWND hwnd;
if( ! MpmValidateWindow(hwndParent) )
return NULL;
if( ISDESKTOPWINDOW(hwndParent) )
return NULL; /* could handle this case... */
for( hwnd = MYWNDOF(hwndParent).hwndTopChild;
hwnd;
hwnd = MYWNDOF(hwnd).hwndNextSibling )
if( MYWNDOF(hwnd).id == id )
return hwnd;
return NULL;
}
/*-----------------------------------------------------------------*/
/* Fill *prect with the Mac rectangle for hwnd. */
/*-----------------------------------------------------------------*/
LOCAL VOID MpmQueryMacRect( hwnd, prect )
HWND hwnd;
Rect* prect;
{
RECTL rcl;
WinQueryWindowRect( hwnd, &rcl );
MpmMapMacOfRcl( hwnd, prect, &rcl );
}
/*-----------------------------------------------------------------*/